package main

import "fmt"

func main() {
	// basicPoint()
	// crossValue()

	// 空指针
	// var p *string
	// fmt.Println(p)
	// fmt.Printf("%T\n", p) // nil *string

	// new 和 make
	// var a *int
	// *a = 100
	// fmt.Println(*a)
	// 在Go语言中对于引用类型的变量，我们在使用的时候不仅要声明它，
	// 还要为它分配内存空间，否则我们的值就没办法存储

	// new & make
	// newValue()

	// make
	makeValue()
}

func basicPoint() {
	a := 10
	b := &a
	fmt.Printf("a:%d ptr:%p\n", a, &a) //a:10 ptr:0x1400000e0a0
	fmt.Printf("b:%p ptr:%T\n", b, b)  //a:0x1400000e0a0 ptr:*int
	fmt.Println(&b)                    // 0x14000050020
	c := *b                            // 指针取值（根据指针去内存取值）
	fmt.Printf("type of c:%T\n", c)    // type of c:int
	fmt.Printf("value of c:%v\n", c)   // value of c:10
}

func crossValue() {
	a := 10
	modify1(a)
	fmt.Println(a) // 10
	modify2(&a)
	fmt.Println(a) // 100
}

func modify1(x int) {
	x = 100
}

func modify2(x *int) {
	*x = 100
}

func newValue() {
	a := new(int)
	b := new(bool)
	fmt.Printf("%T\n", a) // *int
	fmt.Printf("%T\n", b) // *bool
	fmt.Println(*a)       // 0
	fmt.Println(*b)       // false

	var a1 *int
	fmt.Printf("%v,%T\n", a1, a1) // <nil>,*int
	a1 = new(int)
	*a1 = 10
	fmt.Println(*a1) // 10

	fmt.Printf("%v,%T\n", *a1, *a1) // 10,int
}

// slice map chan
func makeValue() {
	var a map[string]int
	a = make(map[string]int, 10)
	a["test"] = 100
	fmt.Println(a) // map[test:100]
}
